# 【一】什么是base64编码
# ● Base64编码，是由64个字符组成编码集：26个大写字母A-Z，26个小写字母a-z，10个数字0~9，符号“+”与符号“/”组成。
# ● Base64编码的基本思路是将原始数据的三个字节拆分转化为四个字节，然后根据Base64的对应表，得到对应的编码数据。
# ● 当原始数据凑不够三个字节时，编码结果中会使用额外的符号“=”来表示这种情况。

# 【二】原理
# 将原始数据的三个字节拆分转化为四个字节，然后根据Base64的对应表，得到对应的编码数据
# ● 一个Base64字符实际上代表着6个二进制位(bit)
#   ○ 4个Base64字符对应3字节字符串/二进制数据。
# ● 3个字符为一组的的base64编码方式如：
"""
16  asii  二进制(bin)
y   121  01111001
o   111  01101111
u   117  01110101
"""

# 二进制 8 位
# 011110010110111101110101
# 转为 base64 编码的二进制 6 位
# 011110 010110 111101 110101
#   30     22     61     53
#   e      W       9      1
'''
# 【三】BASE64编码
import base64

data = "you"
# 把原始的字符串转为二进制数据
data_bytes = data.encode("utf8")
# 对原始数据进行编码
print(base64.b64encode(data_bytes).decode())  # eW91

'''

# 二进制 8 位
# 0111100101101111    ---&gt; 16 位
# 转为 base64 编码的二进制 6 位
# 1111 原本应该是 6 位 但是因为二进制不够了导致不够 6 位 ； 不够6为就直接用0补全
# 111100
# 01111001 01101111 00000000    ---&gt; 24 位  但是二进制是 8 位一组 在补了两个 0 的基础上再补 6 个 0
# 011110 010110 111100 000000
#   30     22     60      0
#   e      W       8      =
'''
data = "yo"
# 把原始的字符串转为二进制数据
data_bytes = data.encode("utf8")
# 对原始数据进行编码
print(base64.b64encode(data_bytes).decode())  # eW8=
'''

# 【三】反向解析出 原本的数据
'''
import base64
data = "eW8="
data_bytes = data.encode("utf8")
print(base64.b64decode(data_bytes).decode())
'''

# 【四】编码长度的补充和完善
import base64

# 【1】完整的数据
'''
data = 'eW91'
data_bytes = data.encode("utf8")
print(base64.b64decode(data_bytes).decode())  # you
'''

# 【2】未完整数据
'''
data = 'eW91eQ'
data_bytes = data.encode("utf8")
print(base64.b64decode(data_bytes).decode())
# binascii.Error: Incorrect padding
'''

# 【3】主动填充数据长度至指定位数
'''
data = 'eW8'
# 判断当前转为二进制数据的长度是否为 4 的倍数
if len(data) % 4 != 0:  # 4 % 3 = 0 ~ 3
    # 给上面的数据填充 =
    data += ("=" * (4 - len(data) % 4))
print(data)  # 'eW8='
print(base64.b64decode(data.encode()))
# yo
'''

# 【4】在 base64 模块内部给我们提供了填充的方式
# AES / DES 加密的pading

# 【五】我们常见的 base64编码是由 大写字母 + 小写字母 + / 和 + 组成
# 但是有些情况下你看到的格式是 base64编码 但是分析后发现 出现了 除了上述字符以外的字符
# base64 变种
# 字符替换 把上面原本存在的字符替换成不应该出现的字符
#   ○ 某些变种将+/替换为*-、.*、.-等组合，以满足不同编程语言对标识符命名规则的要求。
#   ○ 例如，.*可用于那些允许.作为标识符组成部分的语言，.-则适用于XML Nmtoken。
# 长度变换
#   ○ Base64编码将每三个8位字节转换为四个6位字节（共24位），并在每个6位字节前补两个高位0，形成四个8位字节。
#   ○ 因此，编码后的字符串长度理论上比原始数据长1/3，且可能需要添加=作为填充字符以保持字节对齐。

# 【六】总结
# ● Base64编码因其简单、高效、跨平台、透明等特点，成为解决二进制数据在文本环境中传输问题的理想选择。
# ● 它确保了数据的可打印性、兼容性以及在结构化数据交换中的便捷性，广泛应用于邮件附件、网页嵌入资源、API接口数据传输等各种场景。
# ● 然而，需要注意的是，尽管Base64编码提供了某种程度上的“不可见性”，但它不具备安全性，不适合用于保护敏感信息。
# ● 在需要保密的情况下，应结合适当的加密机制来保障数据安全。
